/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cliente;

import java.io.*;
import java.net.UnknownHostException;
import nonGUI.InterfazLinhaComandos;

/**
 *
 * @author Juan Jose Ferreiro Ferreiro
 */
public class Pop3 extends Protocolo {

    private final int min = 5;
    private final int max = 30;

    /**
     * Crea un Cliente POP3 que se conecta a {@code maquina}:{@code porto}
     * 
     * @param maquina Host do servidor POP3
     * @param porto Onde escoita o servidor
     */
    public Pop3(String maquina, int porto) {
        this.servidor = maquina;
        this.porto = porto;
    }

    /**
     * Implementa o comando USER de POP3
     * 
     * @param u nome do usuario
     * @throws java.io.IOException
     * @throws java.lang.Exception
     */
    private void user(String u) throws IOException, Exception {
        out.println("USER " + u);
        comprobaResposta(in.readLine(), "+OK");
    }

    /**
     * Implementa o comando PASS de POP3
     * 
     * @param p Contrasinal do usuario
     * @throws java.io.IOException
     * @throws java.lang.Exception
     */
    private void pass(String p) throws IOException, Exception {
        out.println("PASS " + p);
        comprobaResposta(in.readLine(), "+OK");
    }

    /**
     * Implementa o comando STAT de POP3
     * 
     * @return O numero de correos que hai no buzon
     * @throws java.io.IOException
     * @throws java.lang.Exception
     */
    private int stat() throws IOException, Exception {
        out.println("STAT");
        String resposta = in.readLine();
        comprobaResposta(resposta, "+OK");

        return new Integer(resposta.split(" ")[1]);
    }

    /**
     * Implementa o comando RETR de POP3
     * 
     * @param index Identificador do correo que queremos recuperar
     * @return O contido integro do correo
     * @throws java.io.IOException
     * @throws java.lang.Exception
     */
    private String retr(int index) throws IOException, Exception {
        out.println("RETR " + index);
        comprobaResposta(in.readLine(), "+OK");

        return InterfazLinhaComandos.leAtaPunto(in);
    }

    /**
     * Permite consulta-lo buzon do correo do servidor POP3 para un {@code usuario}. 
     * <P>
     * Tamen permite recuperar os correos que haxa
     * 
     * @param usuario Usuario que quere acceder o buzon
     * @param pass Contrasinal do usuario
     * @throws java.net.UnknownHostException
     * @throws java.io.IOException
     * @throws java.lang.Exception
     */
    public void consultarCorreo(String usuario, String pass) throws UnknownHostException, IOException, Exception {
        abrir();
        comprobaResposta(in.readLine(), "+OK");
        // AUTHORIZATION
        user(usuario);
        pass(pass);

        // TRANSACTION
        int num = stat();
        if (num != 0) {
            System.out.print(Format.format("Id", min, true));
            System.out.print(Format.format("Remitente", max, true));
            System.out.print(Format.format("Destinatario(s)", max, true));
            System.out.println(Format.format("Asunto", max, true));
            System.out.println(linha(min + 3 * max, true));
            Correo[] correo = new Correo[num];
            for (int i = 0; i < num; i++) {
                correo[i] = new Correo(retr(i + 1));
                System.out.print(Format.format(String.valueOf(i + 1), min, true));
                System.out.print(Format.format(correo[i].getRemitente(), max, true));

                String[] dest = correo[i].getDestinatario();
                System.out.print(Format.format(dest[0].trim(), max, true));

                String asunto = correo[i].getAsunto();
                System.out.println(Format.format((asunto == null || asunto.matches("")) ? "(SEN ASUNTO)" : asunto, max, true));
                for (int j = 1; j < correo[i].numeroDestinatarios(); j++) {
                    System.out.print(Format.format("", min + max, true));
                    System.out.println(Format.format(dest[j].trim(), max, true));
                }
                if (i != num) {
                    System.out.println(linha(min + 3 * max, false));
                }
            }
            System.out.println(linha(min + 3 * max, true));

            System.out.println("Desexa recuperar algun?(NON ==> 0)");
            do {
                int opcion = new Integer(new BufferedReader(new InputStreamReader(System.in)).readLine());
                if (opcion == 0) {
                    break;
                }
                if (opcion <= num && opcion >= 1) {
                    System.out.println(linha(100, true));
                    System.out.println(correo[opcion - 1].getTexto());
                    System.out.println(linha(100, true));
                } else {
                    System.out.print("Ese non che me vale. ");
                }
                System.out.println("Desexa recuperar outro?(NON == 0)");
            } while (true);

            // UPDATE
            quit();
            cerrar();
        } else {
            System.out.println("Non ten correo");
        }
    }
}
